package lp2.projeto.agenda;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.swing.*;

import lp2.projeto.gerenciador.Evento;

public class ListaEventos extends JPanel {
	
	private static final long serialVersionUID = 5963146503123578006L;
	protected DefaultListModel listaEventosListModel;
	protected JList listaEventosJList;
	protected JPanel listaEventosJPane;
	protected JTextField listaEventosJTextField;
	protected JLabel listaEventosJLabel;
	protected List<Evento> lista;
	
	public ListaEventos(List<Evento> lista, String descricao){
		super();
		
		listaEventosJPane = this;
		listaEventosJPane.setLayout(new GridBagLayout());
		//listaEventosJPane.setBackground(AgendaGrafica.backgroundColor);
		GridBagConstraints constraints = new GridBagConstraints();
		
		listaEventosJTextField = new JTextField();
		
		listaEventosJTextField.addKeyListener(new KeyListener() {
			
			@Override
			public void keyTyped(KeyEvent arg0) {
				buscaLista();	
			}

			@Override
			public void keyPressed(KeyEvent e) {
				buscaLista();
			}

			@Override
			public void keyReleased(KeyEvent e) {
				buscaLista();
				
			}
		});
		
		constraints.fill = GridBagConstraints.HORIZONTAL;  
		constraints.anchor = GridBagConstraints.CENTER; 
		constraints.insets = new Insets(5,5,5,5);
		constraints.weighty = 0; 
		constraints.ipady = 0;  
		constraints.weightx = 0.5;
		constraints.gridwidth = 1;   
		constraints.gridy = 0;
		listaEventosJPane.add(listaEventosJTextField, constraints);
		
		listaEventosJLabel = new JLabel();
		constraints.fill = GridBagConstraints.HORIZONTAL;  
		constraints.anchor = GridBagConstraints.CENTER; 
		constraints.insets = new Insets(5,5,5,5);
		constraints.weighty = 0; 
		constraints.ipady = 0;  
		constraints.weightx = 0.5;
		constraints.gridwidth = 1;
		constraints.gridy = 2;
		listaEventosJPane.add(listaEventosJLabel, constraints);
		
		// Adicao da lista de eventos
		listaEventosJList = new JList() {
			public String getToolTipText(MouseEvent ev) {
				  int index = locationToIndex(ev.getPoint());
				  if (index > -1) {
					  Evento evento = (Evento)getModel().getElementAt(index);
					  return evento.toStringDetalhado();
				  }
				  return null;
			}
		};
		listaEventosListModel = new DefaultListModel();
		listaEventosJList.setModel(listaEventosListModel);
		
		setEventos(lista, descricao);
		
		constraints.fill = GridBagConstraints.BOTH;
		constraints.weighty = 1;       
		constraints.gridwidth = 1;
		constraints.gridheight = 1;
		constraints.gridy = 1;       
		listaEventosJPane.add(new JScrollPane(listaEventosJList),constraints);
	}
	
	public Evento getEventoSelecionado() {
		if (listaEventosJList.getSelectedIndex() == -1) return null;
		return (Evento) listaEventosListModel.get(listaEventosJList.getSelectedIndex());
	}
	
	public boolean removeEventoSelecionado() {
		if (getEventoSelecionado() != null) {
			lista.remove(getEventoSelecionado());
			listaEventosListModel.remove(listaEventosJList.getSelectedIndex());
			return true;
		}
		return false;
	}
	
	private void buscaLista() {
		listaEventosListModel.removeAllElements();
		for (Evento evento : lista)
			if (evento.getNome().toLowerCase().startsWith(listaEventosJTextField.getText().toLowerCase()))
				listaEventosListModel.addElement(evento);
	}
	
	public void setEventos(List<Evento> lista, String descricao) {
		Evento[] eventosDesordenados = lista.toArray(new Evento[0]);
		Arrays.sort(eventosDesordenados);
		this.lista = new ArrayList<Evento>();
		for (int i = 0; i < eventosDesordenados.length; i++)
			this.lista.add(eventosDesordenados[i]);
		
		listaEventosJLabel.setText("Listando: " + descricao);
		buscaLista();
	}
}
